# coding=utf-8
# author:hhu_zym(qq:1045797922)
# 动脑学院VIP学员

'''
1.列表list_1 = [[1,2,3,4,5],[{“name”:”张三”,”age”:28},{“name”:”James”:”age:30}]] ,获取James的年龄
'''
# list_1 = [[1,2,3,4,5],[{"name":"张三","age":28},{"name":"James","age":30}]]
# print(list_1[1][1]['age'])

'''
2.名词解释: 可迭代对象、迭代器、生成器、装饰器
'''
# 可迭代对象：很多容器数据结构都是可迭代对象，但凡可以返回一个迭代器的对象都可称之为可迭代对象，Iterable，可以用for语句
#             进行遍历操作
# 迭代器：任何实现了__iter__和__next__()（python2中实现next()）方法的对象都是迭代器，__iter__返回迭代器自身，__next__返
#         回容器中的下一个值，Iterator，迭代器一定是可迭代对象
# 生成器：生成器是一种特殊的迭代器，不过比迭代器更加优雅。它不需要再像上面的类一样写__iter__()和__next__()方法了，只需
#         要一个yiled关键字。 生成器一定是迭代器，反之不成立
# 装饰器：python装饰器就是用于拓展原来函数功能的一种函数，这个函数的特殊之处在于它的返回值也是一个函数，使用python装
#         饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。我觉得装饰器就是在将函数当成参数在传递，可以
#         批量处理一些请求

'''
3.名词解释：面向对象编程中“类”中有几种方法？分别解释各种方法的用途。
'''
# 一共包含三种方法：实例方法、类方法和静态方法
# 实例方法的一个主要特点就是需要绑定到一个对象上，python解析器会自动把实例自身传递给方法；静态方法和类方法都需要使用修
# 饰器，分别使用的是staticmethod和classmethod。在类方法中，不管是使用实例还是类调用方法，都会把类作为第一个参数传递进来，
# 这个参数就是类本身。如果继承了这个使用类方法的类，该类的所有子类都会拥有了这个方法，并且这个方法会自动指向子类本身，这
# 个特性在工厂函数中是非常有用的。静态方法是和类与实例都没有关系的，完全可以使用一般方法代替，但是使用静态方法可以更好的
# 组织代码，防止代码变大后变得比较混乱。类方法是可以替代静态方法的。静态方法不能在继承中修改。

'''
4.输出以下代码运行结果，解释变量作用域LEGB.
x=2
z=3
def func_outer():
    y=9
    x=0
    global z
    def func_inner():
        nonlocal x
        x+=5
        z=6
        print('func_innner',max(x,z),max(x,y))
    z+=3
    x+=2
    print(x,y,z)
    return func_inner
func_outer()()
'''
x=2
z=3
def func_outer():
    y=9
    x=0
    global z
    def func_inner():
        nonlocal x
        x+=5
        z=6
        print('func_innner',max(x,z),max(x,y))
    z+=3
    x+=2
    print(x,y,z)
    return func_inner

func_outer()()

'''
输出结果为:
30
2 9 6
func_innner 7 9
'''
'''
在外层函数中 x:enclosing y:enclosing z:global
在内层函数中 x:enclosing y:enclosing z:local
'''

# 5.解释什么是GIL(全局解释器锁)

# 全局解释器锁GIL
# cpython多线程执行的效率往往不够理想,受到GIL锁的影响
# 同一时间内,只有一个线程对python对象进行操作,基本有点接近单线程
# 有很多人都想进城门,每一次只能有一个人进,甲进门,其他都不能进门
# 这样设计的目的主要是为了安全性,cpython内存管理是非线程安全的
# python代码的执行是由python虚拟机(解释器主循环)来控制的,在主循环中同一时间内只能有一个线程来执行
# python虚拟机如何来执行代码
# 1.要获取 GIL
# 2.切换到当前线程去执行python代码
# 3.1 先执行当前线程中的代码
# 3.2 当前线程代码执行完毕,主动让出控制权
# 4.当前让出了控制权,状态处于休眠或者等待
# 5.GIL解锁
# 6.重复上述的过程
# 从语言的层面来说,这个GIL并不是python的缺陷,而是在设计cpython解释器而言
# python设计的年代,单核时代(理所当然)---->随着硬件的不断发展,被多核cpu取代
# 多线程对共享数据的可能会出现混乱
# GIL由于历史原因


# 6.什么是线程、协程、进程
# 线程：在实现了线程的操作系统中,线程是操作系统能够运算调度的最小单位，受GIL锁 的限制（只是并发而不是并行）
# 进程：进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的
#       基础，进程是线程的容器
# 协程：.协程，又称为微线程，看上去像是子程序，但是它和子程序又不太一样，它在执行的过程中，可以在中断当前的子程序后去执
#        行别的子程序，再返回来执行之前的子程序，但是它的相关信息还是之前的。极高的执行效率，因为子程序切换而不是线程切
#        换，没有了线程切换的开销；

# 7.什么时候该用多线程、什么情况该用多进程
# CPU密集型：处理大量计算的问题适合用多进程     进行大量计算的时候出发GIL锁，多线程之间切换耗时
# IO密集型：处理大量IO操作的问题适合用多线程    一个线程IO处于等待状态的时候在动切换到其他线程执行操作

# 8.多个进程间如何通信？（注意多进程知识点回顾！！！）

'''
数据传输 
一个进程需要将它的数据发送给另一个进程，发送的数据量在一个字节到几M字节之间
共享数据 
多个进程想要操作共享数据，一个进程对共享数据
通知事 
一个进程需要向另一个或一组进程发送消息，通知它（它们）发生了某种事件（如进程终止时要通知父进程）。
资源共享 
多个进程之间共享同样的资源。为了作到这一点，需要内核提供锁和同步机制。
进程控制 
有些进程希望完全控制另一个进程的执行（如Debug进程），此时控制进程希望能够拦截另一个进程的所有陷入和异常，并能
够及时知道它的状态改变。
'''


